package service.authentification;

import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import service.configuration.IConfiguration;
import service.configuration.NamingUtil;
import service.encryption.IEncrypter;
import service.mailing.IMailer;
import web.form.ChangePwdForm;
import dao.IDaoAsof;
import entities.PersonSheet;
import entities.Sheet;

@Service
public class Authentificator implements IAuthentificator {
	
	@Resource
	private IDaoAsof dao;
	
	@Resource
	private IConfiguration config;
	
	
	@Resource
	private IMailer mailer;


	@Resource
	private IEncrypter encrypter;

	
	
	
	/**
	 * Création d'un contributeur correspondant à l'identifiant LDAP 
	 * si le mot de passe est correct.
	 * 
	 * @param idLdap identifiant LDAP
	 * @param encryptedPassword mot de passe déjà crypté
	 */
	public Contributor connect(String idLdap, String encryptedPassword) throws Exception {
		if (idLdap == null || encryptedPassword == null)
			return null;
		
		List<Sheet> sheets = dao.findSheetsByProperty(NamingUtil.LDAP, idLdap, config.getPersonType());
		
		if (sheets == null || sheets.size() != 1) {
			return null;
		}
		
		PersonSheet person = (PersonSheet) sheets.get(0);
		
		
	
		if (person.getPassword() == null)  {
			return null;
		}
		if (person.getPassword().equals(encryptedPassword)) {
			return new Contributor(person);
		}
		
		return null;
	}


	@Override
	public Reg register(String personCode) throws Exception {
		
		Reg reg = new Reg();
		PersonSheet person = (PersonSheet)dao.findSheetByCode(personCode, config.getPersonType());
		if(person==null)
			return new Reg(0);
		
		if(person.getPassword()==null){
			reg.setMail(person.getMail());
			reg.setStatus(2);
			String password = generatePassword(6);
			encrypter.setAlgorithme("SHA-1");
			person.setPassword(encrypter.encrypte(password));
			dao.updateSheet(person);
			

			
			mailer.sendHtmlMail(person.getMail(),
					"Confirmation d'inscription [ASOF]",
					"<p>Bonjour "+person.getFirstName()+" "+person.getLastName()+",</p><br/>"+
					"<p>Votre inscription sur le site de l'offre de formation d'Aix-Marseille Université a bien été prise en compte."+"</p>"+
					"<p>Votre identifiant LDAP : "+person.getLdap()+" .</p>"+
					"<p>Votre mot de passe : "+password+" .</p><br/>"+
					"<p>Le site ASOF est accessible à cette adresse : <a href=\"" + config.getApplicationUrl() + "\">" + config.getApplicationUrl() + "</a></p>" +
					"<p>ASOF.<p/>");
		
			return reg;
		}
		return(new Reg(1));
	}


	@Override
	public boolean changePassword(Contributor contributor, ChangePwdForm passwords) {
		
		PersonSheet person = (PersonSheet) dao.findSheetByCode(contributor.getCode(), config.getPersonType());
		
		if (person == null) {
			return false;
		}
	
		if (person.getPassword() == null)  {
			return false;
		}
		if (person.getPassword().equals(passwords.getOldPwd())) {
			person.setPassword(passwords.getNewPwd());
			dao.updateSheet(person);
			mailer.sendHtmlMail(person.getMail(),
					"Confirmation de modification mot de passe [ASOF]",
					"<p>Bonjour "+person.getFirstName()+" "+person.getLastName()+",</p><br/>"+
					"<p>Votre modification du mot de passe sur le site de l'offre de formation d'Aix-Marseille Université a bien été prise en compte."+"</p>"+
					"<p>Le site ASOF est accessible à cette adresse : <a href=\"" + config.getApplicationUrl() + "\">" + config.getApplicationUrl() + "</a></p>" +
					"<p>ASOF.<p/>");
			return true;
		}
		
		return false;
	}

	@Override
	public boolean recoverPassword(String personId) throws Exception {
		
		List<Sheet> sheets= dao.findSheetsByProperty(NamingUtil.LDAP, personId, config.getPersonType());
		
		if (sheets == null || sheets.size() != 1) {
			return false;
		}
		
		PersonSheet person = (PersonSheet) sheets.get(0);
		
		if (person.getPassword() == null) {
			return false;
		}
		
		String password = generatePassword(6);
		encrypter.setAlgorithme("SHA-1");
		person.setPassword(encrypter.encrypte(password));
		dao.updateSheet(person);
		mailer.sendHtmlMail(person.getMail(),
				"Confirmation de Réinitialisation mot de passe [ASOF]",
				"<p>Bonjour "+person.getFirstName()+" "+person.getLastName()+",</p><br/>"+
				"<p>Votre Réinitialisation du mot de passe sur le site de l'offre de formation d'Aix-Marseille Université a bien été prise en compte."+"</p>"+
				"<p>Votre identifiant LDAP : "+person.getLdap()+" .</p>"+
				"<p>Votre nouveau mot de passe : "+password+" .</p><br/>"+
				"<p>Le site ASOF est accessible à cette adresse : <a href=\"" + config.getApplicationUrl() + "\">" + config.getApplicationUrl() + "</a></p>" +
				"<p>ASOF.<p/>");
		return true;
	}
	
	public String generatePassword(int length)
	{
		    String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
		    String pass = "";
		    for(int x=0;x<length;x++)
		    {
		       int i = (int)Math.floor(Math.random() * 62);
		       pass += chars.charAt(i);
		    }
		    
		    return pass;
	}
	public class Reg{
		private int status;
		private String mail;
		
		public Reg (){
		}
		
		public Reg (int status){
			this.status=status;
		}
		
		public int getStatus() {
			return status;
		}
		public void setStatus(int status) {
			this.status = status;
		}
		public String getMail() {
			return mail;
		}
		public void setMail(String mail) {
			this.mail = mail;
		}
		
		
	}
}
